#ifndef ZLBASE_DEVICE_IDOORCONTROLBOARD_H_
#define ZLBASE_DEVICE_IDOORCONTROLBOARD_H_

#include "IDevice.h"
#include "zlbase/datalink/IBaseDatalink.h"
#include "zlbase/protocol/IDoorControlBoardProtocol.h"

namespace zl
{
namespace zlbase
{
/// \brief 开门板接口类
///
/// 该接口类主要提供了常用的几种开门板通用接口（比如以太网口开门板，RS485开门板）
/// 通过不同的协议层，链路层搭配实现适应多种类型开门板的需求
class ZLBASE_API IDoorControlBoard : public IDevice
{
public:
    IDoorControlBoard();
    virtual ~IDoorControlBoard();

    /// \brief 装载与该设备相关的协议和链路对象
    virtual bool SetComponent(std::shared_ptr<IBaseDatalink> datalink,
                              std::shared_ptr<IDoorControlBoardProtocol> protocol);

    /// \brief 获取与该设备相关的链路对象
    virtual std::shared_ptr<IBaseDatalink> GetDatalink();

    /// \brief 获取与该设备相关的协议对象
    virtual std::shared_ptr<IDoorControlBoardProtocol> GetProtocol();

    /// \brief 打开箱门
    ///
    /// 该接口用于打开指定板号开门板上序号为index的格口
    /// \param[in] index 指定格口的序号
    /// \return 错误码
    virtual int32_t OpenLocker(int32_t boxnum);

    /// \brief 打开箱门
    ///
    /// 打开指定箱门，并获该格口的门磁状态 (0x00：门关， 0x01： 门开)
    /// \param[in] boxnum  指定开门板上的箱号
    /// \param[out] status  00：箱子打开成功标志
    /// \param[out] 状态数据长度
    /// \return 错误码
    virtual int32_t OpenLocker(int32_t boxnum, unsigned char &status);

    /// \brief 获取全部门磁状态
    ///
    /// 获取开门板的门磁状态数据，其中每个字节表示一个格口的门磁状态(0x00：门关，0x01：门开）,状态值按（1-24）顺序排列
    /// \param[out] status 二进制状态数据
    /// \param[out] len 状态数据长度
    /// \return 错误码
    virtual int32_t GetDoorStatus(unsigned char *status, size_t &len);

    /// \brief 获取指定门磁状态
    ///
    /// 获取某一个箱门的格口门磁状态数据, 每一个字节表示一个格口的状态 (0x00：门关，0x01：门开）
    /// \param[in] boxnum  指定开门板上的箱号
    /// \param[out] status 二进制状态数据
    /// \return 错误码
    virtual int32_t GetDoorStatus(int32_t boxnum, unsigned char &status);

    /// \brief 获取物品状态
    ///
    /// 获取指定的开门板的物品状态数据，其中每个字节表示一个可口的物品状态
    /// (0x00：无物，0x01：有物)，状态值按（1-24）顺序排列
    /// \param[out] status 二进制状态数据
    /// \param[out] 状态数据长度
    /// \return 错误码
    virtual int32_t GetItemStatus(unsigned char *status, size_t &len);

    /// \brief 获取指定格口物品状态
    ///
    /// 获取指定的开门板某一个箱子的物品状态, 每一个字节表示一个格口的状态 (0x00：无物，0x01：有物)
    /// \param[in] boxnum  指定开门板上的箱号
    /// \param[out] status 二进制状态数据
    /// \return 错误码
    virtual int32_t GetItemStatus(int32_t boxnum, unsigned char &status);
};

}  // namespace zlbase
}  // namespace zl

#endif  // IDOORCONTROLBOARD_H_
